package com.example.common;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.example.domain.SysUser;
import com.example.mapper.SysUserMapper;
import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

@Component
public class JwtUtils {

    // 签名密钥，可以从配置文件中读取
    private String secretKey = "secret";

    // 签名过期时间，可以从配置文件中读取
    private long expirationTime = 3600 * 1000;

    @Autowired
    private SysUserMapper sysUserMapper;

    // 根据用户名和角色生成token
    public String generateToken(String username, List<String> roles) {

        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysUser::getUserName,username);
        SysUser user = sysUserMapper.selectOne(wrapper);

        // 设置token的过期时间
        Date expirationDate = new Date(System.currentTimeMillis() + expirationTime);
        // 创建一个JwtBuilder对象，设置token的用户名、角色、过期时间、签名密钥等信息,jwt是可以存储信息的，如果信息过多可以放到redis中，取得时候从redis里取
        JwtBuilder builder = Jwts.builder()
                .setSubject(username)
                .claim("perms", roles)
                .claim("current_tenant_id",user.getCurrentTenantId())
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS256, secretKey);
        // 返回生成的token字符串
        return builder.compact();
    }

    // 解析token，获取Claims对象，包含用户名、角色、过期时间等信息
    public Claims parseToken(String token) {
        // 使用JwtParser对象，设置签名密钥，解析token，返回Claims对象
        JwtParser parser = Jwts.parser().setSigningKey(secretKey);
        return parser.parseClaimsJws(token).getBody();
    }

    // 判断token是否过期
    public boolean isExpired(String token) {
        // 获取token的过期时间，与当前时间比较，返回结果
        Date expirationDate = parseToken(token).getExpiration();
        return expirationDate.before(new Date());
    }

    // 刷新token，生成一个新的token，延长过期时间
    public String refreshToken(String token) {
        // 获取原来的token中的用户名和角色信息
        Claims claims = parseToken(token);
        String username = claims.getSubject();
        List<String> roles = claims.get("roles", List.class);
        // 调用生成token的方法，返回新的token
        return generateToken(username, roles);
    }
}

